package demo;

import java.util.*;
import java.util.function.Consumer;

/**
 * @program:
 * @description: List 常用方法
 *
 * Iterable
 *      Collection
 *          list
 *              CopyOnWriteArrayList
 *              LinkedList
 *              AbstractList
 *                  Vector
 *                      Stack
 *                  ArrayList
 *
 * @author: dingwen
 * @create: 2021/2/3 15:22
 **/
public class    ListDemo {
    public static void main(String[] args) {
       /*
       * 允许添加重复元素
       * 元素允许为null
       * 列表索引从0开始
       * 支持泛型
       * */
       String str = "t a l k i s c h e a p s h o w m e t h e c o d e";

       // String -> Array ->  List
       List<String> list1 = Arrays.asList(str.split(" "));
        System.out.println(list1);

        //集合中元素数量
        System.out.println(list1.size());

        //是=是否为空
        System.out.println(list1.isEmpty());

        //是否包含某一元素
        System.out.println(list1.contains("a"));


        //以适当的顺序返回包含此列表中所有元素的数组
        // list1.toArray();


        //一下操作必须是实现类
        list1 = new ArrayList<>(list1);
        list1.add("**");


        list1.add(6,"dingwen");
        //java.lang.UnsupportedOperationException

        //从此列表中删除指定元素的第一个匹配项
        System.out.println(list1.remove("t"));




        //求两个集合的交集
        List<String> list2 = new ArrayList<>();
        list2.add("dingwen");
        list2.add("t");
        list1.retainAll(list2);

        //删除所有的元素
//        list2.clear();

        // 以适当的顺序返回此列表中元素的迭代器
        Consumer<String> stringConsumer = System.out::print;

        //返回列表中元素的列表迭代器 迭代元素
        list2.listIterator(2).forEachRemaining(stringConsumer);
        System.out.println();
        list2.iterator().forEachRemaining(stringConsumer);

        //get set
        list2.set(1,"000");
        System.out.println(list2.get(1));

        // list1.iterator().forEachRemaining(stringConsumer);
        //返回指定fromIndex（包含）和toIndex（不包括）之间的此列表部分的视图
        list1.subList(1,1).iterator().forEachRemaining(stringConsumer);

        //两个List合并 可选择从何处开始合并
        list1.addAll(2,list2);


        List<Integer> list3= new ArrayList<>();
        list3.add(1);
        list3.add(2);
        list3.add(3);

        list3.replaceAll(num -> num * 100);

        //此处演示迭代器使用
        Iterator<Integer> iterator = list3.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }


        //sort

        List<Integer> list5 = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            list5.add(random.nextInt(1000));
        }
        Consumer<Integer> integerConsumer = System.out::print;
        list5.iterator().forEachRemaining(integerConsumer);
        //升序
        list5.sort((a,b) -> a-b);
        //降序
        //list5.sort((a,b) -> b-a);
        list5.iterator().forEachRemaining(integerConsumer);
        System.out.println();
        list5.forEach(num -> System.out.print("  "+ num));
    }

}
